package com.dingding.gmall.order.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liugongding
 * @description:
 * @date 2022/2/22 11:58 PM
 */

@Configuration
public class RabbitMqConfig {

    //@Autowired
    //RabbitTemplate rabbitTemplate;

    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    ///**
    // * MyRabbitConfig对象创建完成之后，执行这个方法
    // */
    ////@PostConstruct
    //public void initRabbitTemplate(){
    //
    //    /**
    //     * 1、只要消息到达Broker，ConfirmCallback回调设置ack为true
    //     * correlationData 当前消息的唯一id
    //     * ack 消息是否成功收到
    //     * cause 失败原因
    //     */
    //    rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
    //        /**
    //         * 每发送一个消息都记录在数据库,消息未成功抵达broker的消息定时重发
    //         * 重发成功的消息,修改数据库的状态
    //         */
    //        System.out.println(correlationData +"--"+ ack +"--"+ cause);
    //    });
    //
    //    /**
    //     * 设置消息抵达队列回调,只要消息没有投递给指定队列，就触发失败回调
    //     * message 失败消息的详细信息
    //     * replyCode 回复的状态码
    //     * replyText 回复的文本内容
    //     * exchange 当前消息指定的交换机
    //     * routingKey 当前消息指定的路由键
    //     */
    //    rabbitTemplate.setReturnCallback((message, i, s, s1, s2) -> {
    //        System.out.println("fail message "+message +"--"+ i +"--"+ s +"--"+ s1 +"--"+ s2);
    //    });
    //}


    @Bean
    public Queue orderDelayQueue() {
        /**
         *   String name,  队列名字
         *   boolean durable,  是否持久化
         *   boolean exclusive,  是否排他
         *   boolean autoDelete, 是否自动删除
         *   Map<String, Object> arguments) 属性
         */
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", "order-event-exchange");
        arguments.put("x-dead-letter-routing-key", "order.release.order");
        // 消息过期时间 2分钟
        arguments.put("x-message-ttl", 60000*2);
        return new Queue("order.delay.queue", true, false, false, arguments);
    }

    @Bean
    public Queue orderReleaseOrderQueue() {
        return new Queue("order.release.order.queue", true, false, false);
    }

    @Bean
    public Exchange orderEventExchange(){
        /**
         *   String name,
         *   boolean durable,
         *   boolean autoDelete,
         *   Map<String, Object> arguments
         */
        return new TopicExchange("order-event-exchange", true, false);
    }

    @Bean
    public Binding orderCreateOrderBinding(){
        /**
         * String destination, 目的地（队列名或者交换机名字）
         * DestinationType destinationType, 目的地类型（Queue、Exhcange）
         * String exchange,
         * String routingKey,
         * Map<String, Object> arguments
         */
        return new Binding("order.delay.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order.create.order",
                null);
    }

    @Bean
    public Binding orderReleaseOrderBinding(){
        return new Binding("order.release.order.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order.release.order",
                null);
    }

    @Bean
    public Binding orderReleaseOtherBinding() {
        return new Binding("stock.release.stock.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order.release.other.#",
                null);
    }

}
